//校验密码合法性
//规则： 
    // 规则1： 8-20位、类型： 大写字母、 小写字母、数字、 特殊符号、 至少包含数字和字母 ✅
    // 规则2：连续： 最多连续3位 比如： 1234 ABCD qwer 1qaz  ✅
    //规则3 ：相同字符： 最多相同三位 1111 aaaa @@@@    ✅

    // let str = '1234qwerqqqq',
    // str1 = '123erdfr'



//基本组合
  //校验长度， 以及是否包含 数字、字母、特殊符号两种 8-20位
function basicValidate(str) {
  let data = {
    res:true,
    msg:'密码长度为8-20位，至少包含数字、字母、特殊字符两种组合'
  }
  // const reg = /(?!^(\d+|[a-zA-Z]+|[~!@#$%^&*?]+)$)^[\w~!@#$%^&*?].{8,20}/     //必须包含 数字 字母 下划线的
  const reg = new RegExp(/^(?![^a-zA-Z]+$)(?!\D+$).{7,20}/)      //必须包含 数字 字母其中两项， 可包含特殊字符
  if(!reg.test(str)){
    data.res = false
  }
  return data
}
//规则2 不能包含4个连续字符串
function isLianXu(str){
  let data = {
    msg:'密码格式有误：连续字符最多包含三位',
    res:true
  }
  const len = str.length,
        arr = []
  //根据unicode值判断 1234 abcd 之类的
  for(let i = 1; i < len; i++){
    const res = str.charCodeAt(i) - str.charCodeAt(i-1)
    arr.push(res)
  }
  if(arr.every(item => item === 1)){
    data.res = false
  }
  //1qaz 2wsx等特殊的直接写死
  let lajiArr = ['1qaz','2wsx','3edc','4rfv','5tgb','6yhn','7ujm','8ik,','9ol.']
  if(lajiArr.includes(str.toLowerCase())){
    data.res = false
  }
  return data
}


//检验字符串每个字符都一样
function isAllSame(str){
  const reg = /^(.)\1*$/
  const data = {
    msg:'密码格式有误：相同字符最多包含三位',
    res:reg.test(str)
  }
  return data
}

export function validatePwd(str, limit = 4){
  //规则1：
  if(!basicValidate(str).res) return basicValidate(str)

  for(let i = 0; i < str.length - (limit - 1); i++){
    const current = str.slice(i,i+limit)   //遍历str， 每次都截取4位出来
    //规则2
    if(!isLianXu(current).res) return isLianXu(current)
    //规则3
    if(isAllSame(current).res) return isAllSame(current)
  }
  //最终都通过，返回true
  return true
}

